package br.com.jmed.control;

import java.io.Serializable;
import java.util.List;

import javax.ejb.EJB;
import javax.el.MethodExpression;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import org.richfaces.component.UIDropDownMenu;
import org.richfaces.component.UIMenuGroup;
import org.richfaces.component.UIMenuItem;
import org.richfaces.component.UIToolbar;

import br.com.jmed.model.GruposMenus;
import br.com.jmed.model.Menus;
import br.com.jmed.model.Usuario;
import br.com.jmed.service.SegurancaService;

@ManagedBean(name = "segurancaControl")
@SessionScoped
public class SegurancaControl implements Serializable {

	private static final long serialVersionUID = 1L;

	@EJB
	private SegurancaService segurancaService;

	private UIToolbar uiToolbar;
	
	@Inject
	private Usuario usuario;

	private String login;
	private String senha;
	
	private void processaMenu(List<Menus> listSeguranca,List<GruposMenus> listPermissoes, UIComponent pai, Boolean superUsuario) throws Exception {
		if(listPermissoes == null || listSeguranca == null){
			throw new Exception("Permissões ou menus não cadastrados.");
		}
		
		boolean isAutorizado = false;
		
		for (Menus segurancaItem : listSeguranca) {

			if(!superUsuario){
				for (GruposMenus permissoes : listPermissoes) {

					if (permissoes.getMenus().getCodigo() == segurancaItem.getCodigo()) {
						isAutorizado = true;
						break;
					} else {
						isAutorizado = false;
					}

				}

				if (!isAutorizado) {
					isAutorizado = false;
					continue;
				}
			}

			if(segurancaItem.getMenusPai() == null){
				UIDropDownMenu uiDropDownMenu = new UIDropDownMenu();
				uiDropDownMenu.setLabel(segurancaItem.getDescricao());
				
				if (segurancaItem.getMenusFilho() != null && segurancaItem.getMenusFilho().size() > 0) {
					processaMenu(segurancaItem.getMenusFilho(), listPermissoes, uiDropDownMenu, superUsuario);
				}
				
				uiToolbar.getChildren().add(uiDropDownMenu);
			
			}else {
				if (segurancaItem.getMenusFilho() != null && segurancaItem.getMenusFilho().size() > 0) {
					UIMenuGroup uiMenuGroup = new UIMenuGroup();
					uiMenuGroup.setLabel(segurancaItem.getDescricao());
					
					processaMenu(segurancaItem.getMenusFilho(), listPermissoes, uiMenuGroup, superUsuario);
					pai.getChildren().add(uiMenuGroup);
				}else {
					UIMenuItem uiMenuItem = new UIMenuItem();
					uiMenuItem.setLabel(segurancaItem.getDescricao());
					
					uiMenuItem.setActionExpression(createMethodExpression(segurancaItem.getAcao()));
					uiMenuItem.setImmediate(true);
					
					pai.getChildren().add(uiMenuItem);
				}
				
			}
			
		}
	}

	public String login() {
		try {
			usuario = segurancaService.login(login, senha);
			List<GruposMenus> listGruposMenus = segurancaService.getPermissoes(usuario.getUsuariosGrupos());
			List<Menus> listMenus = segurancaService.getListMenus();
			uiToolbar = new UIToolbar();
			
			processaMenu(listMenus, listGruposMenus, uiToolbar,usuario.getSuperusuario());
			HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
			session.setAttribute("usuario", usuario);
		} catch (Exception e) {
	        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,"Usuário e/ou senha inválidos.", e.getMessage()));
	        senha = null;
	        return null;
	        
		}
		return "/index.xhtml";
	}

	public String sair(){
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().clear();
		return "/login.xhtml";
	}
	
	public MethodExpression createMethodExpression(String action) {
		MethodExpression methodExpression = FacesContext
				.getCurrentInstance()
				.getApplication()
				.getExpressionFactory()
				.createMethodExpression(
						FacesContext.getCurrentInstance().getELContext(),
						action, null, new Class<?>[0]);
		return methodExpression;
	}
	
	public UIToolbar getUiToolbar() {
		return uiToolbar;
	}

	public void setUiToolbar(UIToolbar uiToolbar) {
		this.uiToolbar = uiToolbar;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public void setSegurancaService(SegurancaService segurancaService) {
		this.segurancaService = segurancaService;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	
}
